package com.zdp.leetcodeMiddle;


/*
* 题目描述：
* 给定两个以字符串形式表示的非负整数 num1 和 num2，返回 num1 和 num2 的乘积，
* 它们的乘积也表示为字符串形式。
示例 1:
输入: num1 = "2", num2 = "3"
输出: "6"
示例 2:
输入: num1 = "123", num2 = "456"
输出: "56088"
说明：
num1 和 num2 的长度小于110。
num1 和 num2 只包含数字 0-9。
num1 和 num2 均不以零开头，除非是数字 0 本身。
不能使用任何标准库的大数类型（比如 BigInteger）或直接将输入转换为整数来处理。
来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/multiply-strings
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
* */
public class 字符串相乘_43 {
    public static void main(String[] args) {
        字符串相乘_43 demo = new 字符串相乘_43();
        String multiply = demo.multiply("123", "45");
        System.out.println(multiply);
    }

    /*
    * 模拟乘法
    * 下面的每一位都要乘上上面
    * 然后相加,但我这个好像有点慢
    * */
    public String multiply(String num1, String num2) {
        if(num1.startsWith("0")|| num2.startsWith("0")){
            return "0";
        }
        String high;
        String low;
        if(num1.length()>=num2.length()){
            high = num1;
            low = num2;
        }else{
            high = num2;
            low = num1;
        }
        StringBuilder result = new StringBuilder();
        int j = high.length()-1;
        for(int i=low.length()-1;i>=0;i--,j--){
            int first = low.charAt(i)-'0';
            int jinwei = 0;
            StringBuilder temp = new StringBuilder();
            for(int k=low.length()-1-i;k>0;k--){
                temp.append('0');
            }
            for(j=high.length()-1;j>=0;j--){
                int second = high.charAt(j)-'0';
                int num = first*second + jinwei;
                temp.append(String.valueOf(num%10));
                jinwei = num/10;
            }
            if(jinwei>0){
                temp.append(jinwei);
            }
            if(result.length()==0){
                // 第一次
                result.append(temp);
            }else{
                // 不是第一次，要进行加法操作
                jinwei = 0;
                int kk = 0;
                for(;kk<result.length();kk++){
                    int one = result.charAt(kk)-'0';
                    int two = temp.charAt(kk)-'0';
                    int nn = one+two+jinwei;
                    result.replace(kk,kk+1,String.valueOf(nn%10));
                    jinwei = nn/10;
                }
                for(;kk<temp.length();kk++){
                    int one = temp.charAt(kk)-'0';
                    one = one+jinwei;
                    result.replace(kk,kk+1,String.valueOf(one%10));
                    jinwei = one/10;
                }
                if(jinwei>0){
                    result.append(String.valueOf(jinwei));
                }
            }
        }

        return result.reverse().toString();
    }

    /*
     * 直接用数组来存储，用乘法来解决，看官方题解的图比较容易懂
     * */
    public String multiply1(String num1, String num2) {
        if(num1.startsWith("0")|| num2.startsWith("0")){
            return "0";
        }
        int m = num1.length();
        int n = num2.length();
        int[] result = new int[m+n];
        for(int i=m-1;i>=0;i--){
            int first = num1.charAt(i)-'0';
            for(int j=n-1;j>=0;j--){
                int second = num2.charAt(j)-'0';
                result[i+j+1] += first*second;
            }
        }
        // 处理进位
        for(int i=m+n-1;i>0;i--){
            result[i-1] += result[i]/10;
            result[i] = result[i]%10;
        }
        // 高位为0则舍去
        int index = result[0]==0?1:0;
        StringBuilder result1 = new StringBuilder();
        while(index<m+n){
            result1.append(result[index++]);
        }
        return result1.toString();
    }

}
